package com.ouyu.mvc.proxy;

import com.ouyu.mvc.jdbc.ConnectionJdbc;
import com.ouyu.mvc.selfAnnotation.JQuery;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

import java.lang.reflect.Method;
import java.sql.ResultSet;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ouyu
 * Date: 2018-10-26
 * Time: 9:42
 */
public class MethodProxy implements MethodInterceptor {
    /*@Override
    public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {
        //如果传进来是一个已实现的具体类（本次演示略过此逻辑)
        if (Object.class.equals(method.getDeclaringClass())) {
            try {
                return method.invoke(this, args);
            } catch (Throwable t) {
                t.printStackTrace();
            }
            //如果传进来的是一个接口（核心)
        } else {
            return run(method, args);
        }
        return null;
    }

    *//**
     * 实现接口的核心方法
     * @param method
     * @param args
     * @return
     *//*
    public Object run(Method method,Object[] args){
        //TODO
        //如远程http调用
        //如远程方法调用（rmi)
        //....
        ResultSet rs =ConnectionJdbc.writeSql((String)args[0]);
        return rs;
        //return "method call success!";
    }*/

    private Object target;//业务类对象，供代理方法中进行真正的业务方法调用

    //相当于JDK动态代理中的绑定
    public Object getInstance(Object target) {
        this.target = target;  //给业务对象赋值
        Enhancer enhancer = new Enhancer(); //创建加强器，用来创建动态代理类
        enhancer.setSuperclass(this.target.getClass());  //为加强器指定要代理的业务类（即：为下面生成的代理类指定父类）
        //设置回调：对于代理类上所有方法的调用，都会调用CallBack，而Callback则需要实现intercept()方法进行拦
        enhancer.setCallback(this);
        // 创建动态代理类对象并返回
        return enhancer.create();
    }
    // 实现回调方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, org.springframework.cglib.proxy.MethodProxy methodProxy) throws Throwable {
        System.out.println("预处理——————");

       // methodProxy.invokeSuper(o, objects); //调用业务类（父类中）的方法
        String sql=null;
        if(method.isAnnotationPresent(JQuery.class)){
           JQuery jQuery= method.getAnnotation(JQuery.class);
            sql = jQuery.value();
        }else{
            throw new RuntimeException("忘记写JQuery注解了吧");
        }
        Object rs = ConnectionJdbc.writeSql(sql, method.getReturnType(),method.getGenericReturnType());
        System.out.println("调用后操作——————");
        return rs;
    }
}
